Auth0をPHP (Laravel)で使ってみる
Auth0のPHP (Laravel)チュートリアルをやってみましたので、その内容を書いていきます。
前提
- Auth0のサインアップが完了していること
Auth0アプリケーションの作成
今回はAuth0のサインアップ後にデフォルトで作成されているアプリケーションを使うことにします。
サンプルアプリケーションの作成
Laravelプロジェクトを作成します。
laravel new auth0-sample
あとで.envファイルが必要になりますが、既に作成されておりますので新規作成は不要です。
Auth0 pluginとSDKのインストール
作成したプロジェクトのディレクトリへ移動します。
cd auth0-sample
下記を実行します。
composer require auth0/login:"~5.0"
完了すると、下記のライブラリが追加されます。
- Auth0 PHP SDK
- vendor\auth0\auth0-php
- Auth0 Laravel plugin
- vendor\auth0\login
Auth0を使うための準備
Auth0サービスをLaravelのサービスプロバイダーに登録
config/app.php
に下記を追加します。
'providers' => [ ・・(略)・・ /** * Auth0 */ Auth0\Login\LoginServiceProvider::class,
Auth0\Login\LoginServiceProvider
のregister()
メソッドを確認すると、
Auth0サービスがLaravelのサービスコンテナへ登録されるようになっております。
また、Laravelのログアウトイベントをイベントリスナーに登録し、Auth0のログアウト処理が呼び出されるようになっております。
・・(略)・・ public function register() { // Bind the auth0 name to a singleton instance of the Auth0 Service $this->app->singleton('auth0', function () { return new Auth0Service(); }); // When Laravel logs out, logout the auth0 SDK trough the service \Event::listen('auth.logout', function () { \App::make('auth0')->logout(); }); \Event::listen('user.logout', function () { \App::make('auth0')->logout(); }); \Event::listen('Illuminate\Auth\Events\Logout', function () { \App::make('auth0')->logout(); }); } ・・(略)・・
Auth0ファサードの登録
必須では無いですが、ファサードを使う場合に備えて、config/app.php
に下記を追加しておきます。
'aliases' => [ ・・(略)・・ /** * Auth0 */ 'Auth0' => Auth0\Login\Facade\Auth0::class,
Auth0UserRepositoryの登録
認証済みユーザーを格納するためのクラスを登録します。
app/Providers/AppServiceProvider.php
のregister()
メソッドに下記を追加します。
class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // Auth0 $this->app->bind( \Auth0\Login\Contract\Auth0UserRepository::class, \Auth0\Login\Repository\Auth0UserRepository::class ); }
config/laravel-auth0.phpの作成と設定
下記を実行します。
$ php artisan vendor:publish
下記のようなメッセージが表示され、入力を求められます。
Which provider or tag's files would you like to publish?: [0 ] Publish files from all providers and tags listed below [1 ] Provider: Auth0\Login\LoginServiceProvider [2 ] Provider: BeyondCode\DumpServer\DumpServerServiceProvider [3 ] Provider: Fideloper\Proxy\TrustedProxyServiceProvider [4 ] Provider: Illuminate\Foundation\Providers\FoundationServiceProvider [5 ] Provider: Illuminate\Mail\MailServiceProvider [6 ] Provider: Illuminate\Notifications\NotificationServiceProvider [7 ] Provider: Illuminate\Pagination\PaginationServiceProvider [8 ] Provider: Laravel\Tinker\TinkerServiceProvider [9 ] Tag: config [10] Tag: laravel-errors [11] Tag: laravel-mail [12] Tag: laravel-notifications [13] Tag: laravel-pagination >
Auth0\Login\LoginServiceProvider
を選択するので、1
を入力してEnter。
> 1
Publishing complete.と表示されればOKです。
Copied File [/vendor/auth0/login/src/config/config.php] To [/config/laravel-auth0.php] Publishing complete.
config/laravel-auth0.php
が作成されていることを確認します。
.envファイルの設定
.envファイルに下記を追加して値を設定します。
// Auth0 AUTH0_DOMAIN=YOUR_DOMAIN AUTH0_CLIENT_ID=YOUR_CLIENT_ID AUTH0_CLIENT_SECRET=YOUR_CLIENT_SECRET
値はAuth0管理画面のApplications > Settingsで確認できます。
Auth0サーバーからコールバックを受けるためのルーティング設定
Auth0サーバーからコールバックを受けるためのルーティング設定を行います。
routes/web.php
に下記を追加します。
// Auth0 Route::get( '/auth0/callback', '\Auth0\Login\Auth0Controller@callback' )->name( 'auth0-callback' );
ログイン、ログアウト処理を行うためのコントローラー作成
下記を実行し、コントローラーファイルを作成します。
php artisan make:controller Auth/Auth0IndexController
作成されたapp/Http/Controllers/Auth/Auth0IndexController.php
を下記ののようにします。
class Auth0IndexController extends Controller { /** * Redirect to the Auth0 hosted login page * * @return mixed */ public function login() { $authorize_params = [ 'scope' => 'openid email email_verified', // Use the key below to get an Access Token for your API. // 'audience' => config('laravel-auth0.api_identifier'), ]; return \App::make('auth0')->login(null, null, $authorize_params); } /** * Log out of Auth0 * * @return mixed */ public function logout() { \Auth::logout(); $logoutUrl = sprintf( 'https://%s/v2/logout?client_id=%s&returnTo=%s', env('AUTH0_DOMAIN'), env('AUTH0_CLIENT_ID'), env('APP_URL')); return \Redirect::intended($logoutUrl); } }
login()
メソッドとlogout()
メソッドのためのルーティング設定を行うため、routes/web.php
に下記を追加します。
Route::get('/login', 'Auth\Auth0IndexController@login' )->name( 'login' ); Route::get('/logout', 'Auth\Auth0IndexController@logout' )->name( 'logout' )->middleware('auth');
Laravelの認証機能との統合
config/auth.php
のproviders
を下記のようにします。
'providers' => [ //'users' => [ // 'driver' => 'eloquent', // 'model' => App\User::class, //], 'users' => [ 'driver' => 'auth0' ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ],
サンプル画面にログイン、ログアウトのリンクを設定
resources/views/welcome.blade.php
の@if (Route::has('login'))
部分を下記のようにします。
<body> <div class="flex-center position-ref full-height"> @if (Route::has('login')) <div class="top-right links"> @auth <a href="{{ route('logout') }}">Logout</a> @else <a href="{{ route('login') }}">Login/Signup</a> @endauth </div> @endif
Auth0のアプリケーション設定
管理画面のアプリケーション設定を行います。
今回のサンプルアプリケーションの場合は、下記のようになります。
- Allowed Callback URLs
- https://{ドメイン}/auth0/callback
- Application Login URI
- https://{ドメイン}/login
- Allowed Logout URLs
- https://{ドメイン}/
Logout URLの設定値について
この値はログアウト処理のエンドポイントのreturnTo
パラメーターに付与される値になります。
app/Http/Controllers/Auth/Auth0IndexController.php
のlogout()
メソッドで指定する値が下記のようになっておりますので、env('APP_URL')
が渡されます。
その為、Allowed Logout URLs
の値をhttps://{ドメイン}/
にしております。
public function logout() { \Auth::logout(); $logoutUrl = sprintf( 'https://%s/v2/logout?client_id=%s&returnTo=%s', env('AUTH0_DOMAIN'), env('AUTH0_CLIENT_ID'), env('APP_URL')); return \Redirect::intended($logoutUrl); }
サンプルアプリケーションのデプロイ
サンプルアプリケーションは、サーバーなどにデプロイしてください。
試してみる
未ログイン状態
画面右上の表示がLOGIN/SIGNUP
になってます。
ログイン処理を行う
画面右上のLOGIN/SIGNUP
をクリックします。
すると、Auth0で提供されるログイン画面が表示されました。
サインアップする
まだログインできるユーザーがいないので、サインアップしてみます。
サインアップ完了&ログイン状態
画面右上の表示がLOGOUT
になってます。
ログアウト処理
画面右上のLOGOUT
をクリックすると、ログアウト処理が行われて、returnTo
パラメーターに指定されるhttps://{ドメイン}/
に戻ってきます。
LaravelのAuthファサードで認証確認と認証済みユーザーの取得
Auth
ファサードを下記のように使用することで、認証確認と認証済みユーザーの取得ができます。
Auth::check()
- 認証済みかどうかの確認
Auth::user()
- 認証済みユーザーの情報
確認準備
今回はそれぞれの処理結果を出力するだけのコントローラーを作成します。
php artisan make:controller Auth0TestController
app/Http/Controllers/Auth0TestController.php
を下記のようにします。
class Auth0TestController extends Controller { public function authCheck() { echo \Auth::check(); } public function authUser() { echo \Auth::user(); } }
routes/web.php
に下記を追加します。
Route::get('/auth-check', 'Auth0TestController@authCheck' ); Route::get('/auth-user', 'Auth0TestController@authUser' );
Auth::check()の確認
認証済みだとtrue(1)
が返ってきます。
Auth::user()の確認
こんなふうに情報を取得できます。
UserInfoの取得
このようにすることで取得できます。
public function getUser() { $userinfo = \App::make('auth0')->getUser(); echo json_encode($userinfo); }
おわりに
今回はAuth0をPHP(Laravel)で使用する場合のチュートリアルを通して、Auth0とLaravelの認証機能を統合できることが確認できました。